iT邦幫忙

1

在 DevContainer 中運行 Stable Diffusion 模型

2022-10-08 13:06:272966 瀏覽
  • 分享至 

  • xImage
  •  

前言

自從看過保哥的教學使用 VSCode 的 Remote Container 打造 Java 開發環境後,就很想把各種東西都丟進容器中,最近 Stable Diffusion 很紅,也跟風玩看看,之前有先在 Colab 上跑,觀摩好幾個 Colab 筆記本,寫出自己的 Colab 版本,但要轉移到容器上跑,還是遇到一些問題

執行環境

  • Win10 21H2 OS Build 19044.2075
  • VSCode v1.72
  • Nvidia GPU driver version 516.59
  • Docker Desktop v4.12

過程中遇到的問題

  • 要怎麼讓容器使用外部環境的 GPU
    編輯devcontainer.json,在跟build同層級(也就是最外層的大括號內的第一層)的地方新增runArgs鍵,值設定為["--gpus","all"],就能在呼叫 Docker 執行時自動加上參數,這樣就能讓容器使用外部 GPU,不需要在容器內裝驅動程式

  • ImportError: libGL.so.1: cannot open shared object file
    網路上解決這問題的方法很多,試過後比較喜歡也有用的解法是pip install opencv-contrib-python-headless,但想要解決下面提到的問題時,卻一直卡在這個問題上

  • 要怎麼讓容器重建時不需要重新下載需要的各種檔案
    原本以為只需要編輯Dockerfile就好,但為了提高自動化程度,devcontainer.json也需要修改,過程中最想不通的就是上面那問題的解法不是每次都有用,為了確保每次都能重建成功,開始了漫長的試錯過程,原來是因為要先移除opencv-contrib-python-headless再重裝才不會失敗,而且移除重裝opencv-contrib-python-headless的順序一定要擺在指令最後,先把其他相依套件都裝完最後再來移除重裝才不會遇到ImportError

  • An error occured setting up the container
    如果沒修改過Dockerfile卻常常在按下容器重建時跳出這訊息的話,我猜是因為把舊容器刪掉到開始重建新容器需要一段時間,但 VSCode 關掉再開的速度太快,導致太早去讀取容器內的資源,所以一直跳錯誤訊息,目前解法就是過一段時間再按retry,或是狂按retry直到 VSCode 得知容器開始重建就不會再跳錯誤訊息了,也就是右下角會出現可以查看 Docker 紀錄通知的時候。如果出現可以查看紀錄的訊息卻還是有這個錯誤訊息,那就是修改過的Dockerfile有問題

  • 移除套件時跳出沒有權限的訊息
    pip uninstall前面加上sudo

步驟

前置準備

  • 一張 Nvidia 的顯示卡
  • 安裝 VSCode 跟 Dev Containers套件
  • 安裝 Docker Desktop
  • 在 Win10 安裝 Nvidia 最新版驅動程式
  • 申請 Huggingface 帳號,再到此網址取得Access Tokens
  • 照著保哥的影片創建本機資料夾,選擇Python 3.10(bullseye)feature都不用選,不需要Nodejs
  • 假設在 VSCode 中選擇的本機資料夾名稱為stableDiffusion,那麼在本機stableDiffusion目錄下或容器內/workspaces/stableDiffusion的目錄下執行git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui,若本機沒裝git就等進到容器內再下這行指令
  • 自行選擇要下載哪個模型 ckpt 檔案或者全部下載,需要之前取得的 access token,懶得每次輸入可以設一個環境變數儲存header,下載回來的檔案都放在stableDifusion資料夾底下,也就是 VSCode 預設的開啟位置,這也是COMMANDLINE_ARGS參數設為--ckpt-dir ./的原因
    • 標準1.4版 wget --header="Authorization: Bearer access_token_string" https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
    • Waifu 1.3 wget --header="Authorization: Bearer access_token_string" https://huggingface.co/hakurei/waifu-diffusion-v1-3/resolve/main/wd-v1-3-full.ckpt
    • trinart2_step115000 wget --header="Authorization: Bearer access_token_string" https://huggingface.co/naclbit/trinart_stable_diffusion_v2/resolve/main/trinart2_step115000.ckpt

要修改的檔案跟修改處

stableDifusion目錄結構

.
├── .devcontainer
│   ├── Dockerfile
│   └── devcontainer.json
├── scripts
│   └── pipInstall.sh
└── stable-diffusion-webui    
    ├── .git
    ├── .github
    ├── .gitignore
     底下省略

devcontainer.json部分內容

	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],

	// Use 'postCreateCommand' to run commands after the container is created.
+	"postCreateCommand": "cd stable-diffusion-webui && git pull && COMMANDLINE_ARGS=$COMMANDLINE_ARGS python launch.py",

	// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+	"runArgs": ["--gpus","all"
+    ],
	"remoteUser": "vscode"
}

Dockerfile部分內容

+ENV COMMANDLINE_ARGS="--ckpt-dir ./"
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi

# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
+COPY stable-diffusion-webui/requirements.txt /tmp/pip-tmp/
+COPY stable-diffusion-webui/repositories/CodeFormer/requirements.txt /tmp/pip-tmp/CodeFormer
+COPY scripts/pipInstall.sh .
+RUN bash -i pipInstall.sh
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
#     && apt-get -y install --no-install-recommends <your-package-list-here>

pipInstall.sh 由於內容全是新增的,因此markdown就不用diff改用bash

# 自行安裝 torch 是因為有不相容的訊息,如果沒有不相容訊息,可以去掉這段
pip3 --disable-pip-version-check --no-cache-dir install clip torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 \
&& pip3 --disable-pip-version-check --no-cache-dir install -r \
/tmp/pip-tmp/requirements.txt -r /tmp/pip-tmp/CodeFormer \
&& sudo pip3 uninstall opencv-contrib-python-headless \
&& pip3 --disable-pip-version-check --no-cache-dir install opencv-contrib-python-headless \
&& rm -rf /tmp/pip-tmp

心得

Colab 上我是用webui.sh跑在虛擬環境中,不過其實這是給那些沒跑在容器中的人使用的,因此這次我就學StableDiffusionUI-Voldemort 連結 的作法,直接呼叫launch.py讓 web 伺服器跑起來,實際運行後,最高可以一次產 16 * 8 = 128 張圖,會吃掉十幾 G 的系統記憶體,GPU 記憶體則是都維持在九成左右,產完圖之後要在 web 介面顯示出來時,有時會導致卡頓,連在單機都會這樣,也因此在 Colab 平台時,圖一多常常看不到算出來的圖,運算時也能感受到顯示卡有多熱情

嘗試跑兩個模型參數融合,把系統記憶體剩下的十幾 G 幾乎吃光光,SSD 可能因此寫入很多資料,融合模型前要三思,GPU 記憶體反而吃不多,合併時也是很快就結束了,倒是儲存檔案也花了一小段時間;融合後的模型會讓 GPU 記憶體時間曲線圖出現明顯的谷底,也就是資料移入跟移出時間都拉長了,其他模型的記憶體時間曲線圖是 V 字形,融合模型則是 _/

分辨不出圖片哪裡不好,因此也只嘗試了極端參數會有讓產出的圖有什麼變化,CFG Scale值越小,產出的圖越模糊,反而有種朦朧美,值越大,圖片就幾乎都是色塊,也有模型的取樣步驟(Sampling Steps)拉到最高 150 反而產生都是雜訊的圖

參考資料

VOLDY RETARD GUIDE
Huggingface
使用 VSCode 的 Remote Container 打造 Java 開發環境
Using GPU in VS code container
StableDiffusionUI-Voldemort V1.2
stable-diffusion-webui
CompVis/stable-diffusion-v1-4
hakurei/waifu-diffusion-v1-3
naclbit/trinart_stable_diffusion_v2
devcontainer.json reference


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言